/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controlador;

import BD.MyException;
import Clases.Categoria;
import Clases.Responsable;
import Clases.Tarea;
import DAO.DAOCategoria;
import DAO.DAOResponsable;
import DAO.DAOTarea;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

/**
 *
 * @author ppr
 */
public class ControladorTarea {

    private List<Responsable> responsables;
    private List<Categoria> categorias;
    private List<Tarea> tareas;
    private DefaultTableModel modeloCompleto;

    public ControladorTarea() {
        this.cargarResponsables();
        this.cargarTareas();
        this.cargarCategorias();
    }

    public TableModel modelResponsable(TableModel modelo) {
        DefaultTableModel model = (DefaultTableModel) modelo;
        //////
        int filas = modelo.getRowCount();
        for (int i = 0; filas > i; i++) {
            model.removeRow(0);
        }
        //////
        for (Responsable responsable : this.responsables) {
            String[] dato = {responsable.getNombre(), responsable.getApodo(), responsable.getEmail()};
            model.addRow(dato);
        }

        return model;
    }

    public ArrayList<String> listaResponsableNombres() {
        ArrayList<String> temp = new ArrayList();
        for (Responsable responsable : this.responsables) {
            temp.add(responsable.getNombre());
        }
        return temp;
    }

    public JComboBox getComboCategorias() {
        JComboBox combo = new JComboBox();

        for (Categoria categoria : categorias) {
            combo.addItem(categoria.getNombre());
        }
        return combo;
    }

    public JComboBox getComboResponsables() {
        JComboBox combo = new JComboBox();

        for (Responsable responsable : responsables) {
            combo.addItem(responsable.getNombre());
        }
        return combo;
    }

    private void cargarCategorias() {
        try {
            this.categorias = DAOCategoria.getCategorias();
        } catch (MyException e) {
            JOptionPane.showMessageDialog(null, "Se produjo un error");
        }
    }

    private void cargarResponsables() {
        try {
            this.responsables = DAOResponsable.getResponsable();
        } catch (MyException e) {
            JOptionPane.showMessageDialog(null, "Se produjo un error");
        }
    }

    public String registrar(Tarea tarea, int selectedIndex, String emailTemp) {
        Categoria ct = this.categorias.get(selectedIndex);
        tarea.setId_Categoria(ct.getId_Categoria());

        for (Responsable responsable : responsables) {
            if (responsable.getEmail().equals(emailTemp)) {
                tarea.setId_Responsable(responsable.getId_Responsable());
                break;
            }
        }

        //validar que se le pueda asignar al responsable la tarea, si se puede agregarla sino informarlo.

        if (DAOTarea.cargarTarea(tarea)) {
            return "Tarea cargada";
        } else {
            return "No se cargo la tarea";
        }
    }

    public TableModel getModeloCompleto() {
        return modeloCompleto;
    }

    public TableModel getModel(TableModel modelo) {
        modeloCompleto = (DefaultTableModel) modelo;
        //////
        int filas = modelo.getRowCount();
        for (int i = 0; filas > i; i++) {
            modeloCompleto.removeRow(0);
        }
        //////
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm");
        Date d = null;
        for (Tarea tarea : this.tareas) {
            d = tarea.getVencimiento();
            String temp = sdf.format(d);
            String[] dato = {tarea.getTitulo(), this.getCategoria(tarea.getId_Categoria()),
                this.getResponsable(tarea.getId_Responsable()), String.valueOf(tarea.getCompletado()), temp, tarea.getPrioridadString()};
            modeloCompleto.addRow(dato);
        }

        return modeloCompleto;
    }

    private void cargarTareas() {
        try {
            this.tareas = DAOTarea.getTarea();
        } catch (MyException e) {
            JOptionPane.showMessageDialog(null, "Se produjo un error");
        }
    }

    private String getCategoria(int idCategoria) {
        for (Categoria categoria : categorias) {
            if (categoria.getId_Categoria() == idCategoria) {
                return categoria.getNombre();
            }
        }
        return "";
    }

    private String getResponsable(int idResponsable) {
        for (Responsable responsable : responsables) {
            if (responsable.getId_Responsable() == idResponsable) {
                return responsable.getNombre();
            }
        }
        return "";
    }

    public String getEmailIndex(int selectedIndex) {
        if (selectedIndex != -1) {
            return responsables.get(selectedIndex).getEmail();
        }
        return "";
    }

    public String getApodoIndex(int selectedIndex) {
        if (selectedIndex != -1) {
            return responsables.get(selectedIndex).getApodo();
        }
        return "";
    }

    public int getId_CategoriaIndex(int selectedIndex) {
        if (selectedIndex != -1) {
            return categorias.get(selectedIndex).getId_Categoria();
        }
        return 0;
    }

    private int getId_ResponsableIndex(int selectedIndex) {
        if (selectedIndex != -1) {
            return responsables.get(selectedIndex).getId_Responsable();
        }
        return 0;
    }

    public DefaultTableModel filtrar(int indexCategoria, int indexPrioridad, int indexResponsable,
            String limiteInferior, String limiteSuperior,
            Calendar dateInferior, Calendar dateSuperior, TableModel modelo) {
        List<Tarea> tareasTemporal = new ArrayList<>(tareas);
        DefaultTableModel model = (DefaultTableModel) modelo;

        float li = 0, ls = 100;
        if (limiteInferior != null && limiteSuperior != null) {
            if (!limiteInferior.isEmpty() && !limiteSuperior.isEmpty()) {
                li = Float.parseFloat(limiteInferior);
                ls = Float.parseFloat(limiteSuperior);
            }
        }



        //////
        int filas = modelo.getRowCount();
        for (int i = 0; filas > i; i++) {
            model.removeRow(0);
        }
        //////
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
        Date d = null;
        //filtro las categorias
        if (indexCategoria != -1) {
            Iterator i = tareasTemporal.iterator();
            while (i.hasNext()) {
                Tarea tarea = (Tarea) i.next();
                if (tarea.getId_Categoria() != this.getId_CategoriaIndex(indexCategoria)) {
                    i.remove();
                }
            }
        }
        //filtro las prioridades
        if (indexPrioridad != -1) {
            Iterator i = tareasTemporal.iterator();
            while (i.hasNext()) {
                Tarea tarea = (Tarea) i.next();
                if (tarea.getPrioridad() != indexPrioridad) {
                    i.remove();
                }
            }
        }
        //filtro el responsable
        if (indexResponsable != -1) {
            Iterator i = tareasTemporal.iterator();
            while (i.hasNext()) {
                Tarea tarea = (Tarea) i.next();
                if (tarea.getId_Responsable() != this.getId_ResponsableIndex(indexResponsable)) {
                    i.remove();
                }
            }
        }


        Iterator i = tareasTemporal.iterator();
        while (i.hasNext()) {
            Tarea tarea = (Tarea) i.next();
            float estadoTemporal = tarea.getCompletado();
            if (estadoTemporal < li || estadoTemporal > ls) {
                i.remove();
            }

        }

        //filtro por fecha

        if (dateInferior != null & dateSuperior != null) {
            Date di = dateInferior.getTime();
            Date ds = dateSuperior.getTime();
            while (i.hasNext()) {
                Tarea tarea = (Tarea) i.next();
                Date dateVto = tarea.getVencimiento();
                if (dateVto.before(di) || dateVto.after(ds)) {
                    i.remove();
                }

            }
        }

        for (Tarea tarea : tareasTemporal) {
            d = tarea.getVencimiento();
            String temp = sdf.format(d);
            String[] dato = {tarea.getTitulo(), this.getCategoria(tarea.getId_Categoria()),
                this.getResponsable(tarea.getId_Responsable()), String.valueOf(tarea.getCompletado()), temp, tarea.getPrioridadString()};
            model.addRow(dato);
        }

        return model;
    }
}